In [ ]:
hightemp.txtは日本の最高気温の記録を都道府県」「地点」「℃」「のタブ区切り形式で格納したファイルである以下の処理を行うプログラムを作成しhightemp.txtを入力ファイルとして実行せよさらに同様の処理をUNIXコマンドでも実行しプログラムの実行結果を確認せよ

10. 行数のカウント

行数をカウントせよ.確認にはwcコマンドを用いよ


In [4]:
with open("hightemp.txt") as f:
    count = len(f.readlines())
print(count)


24

wc

ファイル内のバイト数, 単語数, 及び行数を集計し表示する.
また, 空白で区切られたものを単語として扱う.
表示: 行数 単語数 バイト数

wc [-clw] [--bytes] [--chars] [--lines] [--words] [file]

オプション

  • -c, --bytes, --chars バイト数のみ集計し表示
  • -w, --word 単語数のみ集計し表示
  • -l, --lines 行数のみ集計し表示
  • file

In [5]:
%%bash
wc -l hightemp.txt


      24 hightemp.txt

11. タブをスペースに置換

タブ1文字につきスペース1文字に置換せよ.確認にはsedコマンド,trコマンド,もしくはexpandコマンドを用いよ.


In [8]:
def replace_tab2space(file):
    with open(file) as f:
        for i in f.readlines():
            print(i.strip('\n').replace('\t', ' '))

replace_tab2space('hightemp.txt')


高知県 江川崎 41 2013-08-12
埼玉県 熊谷 40.9 2007-08-16
岐阜県 多治見 40.9 2007-08-16
山形県 山形 40.8 1933-07-25
山梨県 甲府 40.7 2013-08-10
和歌山県 かつらぎ 40.6 1994-08-08
静岡県 天竜 40.6 1994-08-04
山梨県 勝沼 40.5 2013-08-10
埼玉県 越谷 40.4 2007-08-16
群馬県 館林 40.3 2007-08-16
群馬県 上里見 40.3 1998-07-04
愛知県 愛西 40.3 1994-08-05
千葉県 牛久 40.2 2004-07-20
静岡県 佐久間 40.2 2001-07-24
愛媛県 宇和島 40.2 1927-07-22
山形県 酒田 40.1 1978-08-03
岐阜県 美濃 40 2007-08-16
群馬県 前橋 40 2001-07-24
千葉県 茂原 39.9 2013-08-11
埼玉県 鳩山 39.9 1997-07-05
大阪府 豊中 39.9 1994-08-08
山梨県 大月 39.9 1990-07-19
山形県 鶴岡 39.9 1978-08-03
愛知県 名古屋 39.9 1942-08-02

expand

タブをスペースに変換する(1)

expand [-i, --initial] [-t NUMBER, --tabs=NUMBER] [FILE...]

オプション

  • -i, --initial 空白以外の文字直後のタブは無視する
  • -t NUMBER, --tabs=NUMBER タブ幅を数値NUMBERで指定する(デフォルトは8桁)
  • FILE テキスト・ファイルを指定する

In [7]:
%%bash
expand -t 1 hightemp.txt


高知県 江川崎 41 2013-08-12
埼玉県 熊谷 40.9 2007-08-16
岐阜県 多治見 40.9 2007-08-16
山形県 山形 40.8 1933-07-25
山梨県 甲府 40.7 2013-08-10
和歌山県 かつらぎ 40.6 1994-08-08
静岡県 天竜 40.6 1994-08-04
山梨県 勝沼 40.5 2013-08-10
埼玉県 越谷 40.4 2007-08-16
群馬県 館林 40.3 2007-08-16
群馬県 上里見 40.3 1998-07-04
愛知県 愛西 40.3 1994-08-05
千葉県 牛久 40.2 2004-07-20
静岡県 佐久間 40.2 2001-07-24
愛媛県 宇和島 40.2 1927-07-22
山形県 酒田 40.1 1978-08-03
岐阜県 美濃 40 2007-08-16
群馬県 前橋 40 2001-07-24
千葉県 茂原 39.9 2013-08-11
埼玉県 鳩山 39.9 1997-07-05
大阪府 豊中 39.9 1994-08-08
山梨県 大月 39.9 1990-07-19
山形県 鶴岡 39.9 1978-08-03
愛知県 名古屋 39.9 1942-08-02

12. 1列目をcol1.txtに,2列目をcol2.txtに保存

各行の1列目だけを抜き出したものをcol1.txtに,2列目だけを抜き出したものをcol2.txtとしてファイルに保存せよ.確認にはcutコマンドを用いよ.


In [17]:
def write_col(col):
    with open("hightemp.txt", 'r') as f:
        writing = [i.split('\t')[col-1]+"\n" for i in f.readlines()]
    
    with open('col{}.txt'.format(col), 'w') as f:
        f.write("".join(writing))

write_col(1)
write_col(2)

cut

テキスト・ファイルの各行から一部分を取り出す

expand [-i, --initial] [-t NUMBER, --tabs=NUMBER] [FILE...]

オプション

  • -b, --bytes byte-list byte-listで指定した位置のバイトだけ表示する
  • -c, --characters character-list character-listで指定した位置の文字だけ表示する
  • -d, --delimiter delim フィールドの区切りを設定する。初期設定値はタブ
  • -f, --fields field-list field-listで指定したフィールドだけ表示する
  • -s, --only-delimited フィールドの区切りのない行を無視する
  • file テキスト・ファイルを指定する

In [20]:
%%bash 
cut -f 1 hightemp.txt > cut_col1.txt
cut -f 2 hightemp.txt > cut_col2.txt

13. col1.txtとcol2.txtをマージ

12で作ったcol1.txtとcol2.txtを結合し,元のファイルの1列目と2列目をタブ区切りで並べたテキストファイルを作成せよ.確認にはpasteコマンドを用いよ.


In [23]:
with open('col1.txt', 'r') as f1:
    col1 = [i.strip('\n') for i in f1.readlines()]
    
with open('col2.txt', 'r') as f2:
    col2 = [i.strip('\n') for i in f2.readlines()]

writing = ""
for i in range(len(col1)):
    writing += col1[i] + '\t' + col2[i] + '\n'

with open('marge.txt', 'w') as f:
    f.write(writing)

paste

ファイルを水平方向に連結する

paste [オプション] [FILE]

オプション

  • -d --delimiters=LIST タブの代わりに区切り文字をLISTで指定する
  • -s, --serial 縦方向に連結する
  • FILE 連結するファイルを指定する

In [25]:
%%bash
paste col1.txt col2.txt > paste_marge.txt

14. 先頭からN行を出力

自然数Nをコマンドライン引数などの手段で受け取り,
入力のうち先頭のN行だけを表示せよ.確認にはheadコマンドを用いよ.


In [30]:
def head(N):
    with open('marge.txt') as f:
        return "".join(f.readlines()[:N+1])
print(head(3))


高知県	江川崎
埼玉県	熊谷
岐阜県	多治見
山形県	山形

ファイルの先頭部分を表示する

head [-c N[bkm]] [-n N] [-qv] [--bytes=N[bkm]] [--lines=N] [--quiet] [--silent] [--verbose] [file...]

オプション

  • -c N, --bytes N ファイルの先頭からNバイト分の文字列を表示する。Nの後にbを付加したときは,指定した数の512倍のバイトを,kを付加したときは指定した数の1024倍のバイトを,mを付加したときには指定した数の1048576倍のバイトを表示する
  • -n N, --lines N ファイルの先頭からN行を表示する
  • -q, --quiet, --silent ファイル名を表示しない
  • -v, --verbose 常にファイル名を表示する
  • file 表示するファイルを指定する

In [39]:
%%bash
head -n 3 marge.txt


高知県	江川崎
埼玉県	熊谷
岐阜県	多治見

15. 末尾のN行を出力

自然数Nをコマンドライン引数などの手段で受け取り,
入力のうち末尾のN行だけを表示せよ.確認にはtailコマンドを用いよ.


In [47]:
def tail(N):
    with open('marge.txt') as f:
        tail = "".join(f.readlines()[-1:-N:-1])
    return tail
print(tail(3))


愛知県	名古屋
山形県	鶴岡

16. ファイルをN分割する

自然数Nをコマンドライン引数などの手段で受け取り,
入力のファイルを行単位でN分割せよ.同様の処理をsplitコマンドで実現せよ.


In [55]:
def split_flie(name, N):
    with open(name, 'r') as f:
        split = "".join(f.readlines()[:N])
    return split

print(split_flie("marge.txt", 3))


高知県	江川崎
埼玉県	熊谷
岐阜県	多治見

split

ファイルを分割する

split [-lines] [-l lines] [-b bytes[bkm]] [-C bytes[bkm]] [--lines=lines] [--bytes=bytes[bkm]] [--linebytes=bytes[bkm]] [infile [outfile-prefix]]

オプション

  • -lines, -l lines, --lines=lines 元ファイルのlineで指定した行ごとに区切り,出力ファイルに書き出す
  • -b bytes[bkm], --bytes=bytes[bkm] 元ファイルをbytesで示したバイト数で分割し,出力する。数字の後に記号を付加することにより単位を変えることができる。kはKバイトmはMバイト
  • -C bytes[bkm], --line-bytes=bytes[bkm] 各行で区切り出力する。このとき各行でbytesを越える場合は次のファイルに書き出す
  • infile 元ファイルを指定する
  • outfile-prefix 書き出し先ファイルのファイル名のベース名を決定する。出力はベース名にアルファベットを付けたファイル名となる

In [61]:
%%bash
split -l 3 marge.txt split_marge.txt


高知県	江川崎
埼玉県	熊谷
岐阜県	多治見

17. 1列目の文字列の異なり

1列目の文字列の種類(異なる文字列の集合)を求めよ.
確認にはsort, uniqコマンドを用いよ.


In [5]:
def kinds_col(file_name, N=0):
    with open(file_name, 'r') as f:
        tmp = f.readlines()
        
    return set([i.strip('\n') for i in tmp])

print(kinds_col('col1.txt'))


{'愛知県', '千葉県', '岐阜県', '愛媛県', '大阪府', '埼玉県', '静岡県', '高知県', '和歌山県', '山梨県', '山形県', '群馬県'}

18. 各行を3コラム目の数値の降順にソート

各行を3コラム目の数値の逆順で整列せよ
(注意: 各行の内容は変更せずに並び替えよ).
確認にはsortコマンドを用いよ
(この問題はコマンドで実行した時の結果と合わなくてもよい).


In [15]:
def sorted_list(filename, col):
    with open(filename, 'r') as f:
        return_list = [i.strip("\n").split('\t') for i in f.readlines()]
        
    return sorted(return_list, key=lambda x: x[col], reverse=True)

print(sorted_list("hightemp.txt", 2))


[['高知県', '江川崎', '41', '2013-08-12'], ['埼玉県', '熊谷', '40.9', '2007-08-16'], ['岐阜県', '多治見', '40.9', '2007-08-16'], ['山形県', '山形', '40.8', '1933-07-25'], ['山梨県', '甲府', '40.7', '2013-08-10'], ['和歌山県', 'かつらぎ', '40.6', '1994-08-08'], ['静岡県', '天竜', '40.6', '1994-08-04'], ['山梨県', '勝沼', '40.5', '2013-08-10'], ['埼玉県', '越谷', '40.4', '2007-08-16'], ['群馬県', '館林', '40.3', '2007-08-16'], ['群馬県', '上里見', '40.3', '1998-07-04'], ['愛知県', '愛西', '40.3', '1994-08-05'], ['千葉県', '牛久', '40.2', '2004-07-20'], ['静岡県', '佐久間', '40.2', '2001-07-24'], ['愛媛県', '宇和島', '40.2', '1927-07-22'], ['山形県', '酒田', '40.1', '1978-08-03'], ['岐阜県', '美濃', '40', '2007-08-16'], ['群馬県', '前橋', '40', '2001-07-24'], ['千葉県', '茂原', '39.9', '2013-08-11'], ['埼玉県', '鳩山', '39.9', '1997-07-05'], ['大阪府', '豊中', '39.9', '1994-08-08'], ['山梨県', '大月', '39.9', '1990-07-19'], ['山形県', '鶴岡', '39.9', '1978-08-03'], ['愛知県', '名古屋', '39.9', '1942-08-02']]

19. 各行の1コラム目の文字列の出現頻度を求め,出現頻度の高い順に並べる

各行の1列目の文字列の出現頻度を求め,その高い順に並べて表示せよ.確認にはcut, uniq, sortコマンドを用いよ.


In [19]:
def frequency_sort(filename, col):
    from collections import Counter
    with open(filename, 'r') as f:
        return_list = [i.strip("\n").split('\t')[col-1] for i in f.readlines()]
    return [i[0] for i in Counter(return_list).most_common()]

print(frequency_sort("hightemp.txt", 1))


['埼玉県', '山梨県', '山形県', '群馬県', '愛知県', '千葉県', '静岡県', '岐阜県', '愛媛県', '大阪府', '高知県', '和歌山県']

In [ ]: